#ifndef __CURSEUTILS__H__
#define __CURSEUTILS__H__

#include <ncurses.h>

// -- Type ReDefine
// typedef struct {
//     struct screen *screen;
// } CurseScreen;
// CurseScreen Screen = {0};

typedef WINDOW CurseWindow;

// ---------------------------------------------------------------- Base
/**
 * @brief  开启输入回显
 * @note   
 * @retval None
 */
void curseEnalbeEcho();
/**
 * @brief  关闭输入回显
 * @note   
 * @retval None
 */
void curseDisalbeEcho();
/**
 * @brief  开启实时输入
 * @note   
 * @retval None
 */
void curseEnableCharBreak();
/**
 * @brief  关闭实时输入
 * @note   
 * @retval None
 */
void curseDisbleCharBreak();


/**
 * @brief  将键盘输入映射到 Window
 * @note   
 * @param  *window: 
 * @retval None
 */
void curseKeyboardUse(CurseWindow *window);
/**
 * @brief  移除键盘输入映射到 Window
 * @note   
 * @param  *window: 
 * @retval None
 */
void curseKeyboardUnUse(CurseWindow *window);

// ---------------------------------------------------------------- Screen
/**
 * @brief  初始化 ncurses 屏幕
 * @note   
 * @retval None
 */
void createCurseScreen();
/**
 * @brief  刷新 ncurses 屏幕
 * @note   
 * @retval None
 */
void curseScreenRefresh();
/**
 * @brief  销毁 ncurse 屏幕
 * @note   
 * @retval None
 */
void destroyCurseScreen();

// --- CurseScreen Define function
/**
 * @brief  宏: 获取屏幕的高宽
 * @note   
 * @retval 
 */
#define curseScreenMaxYX(y, x)              \
        getmaxyx(stdscr, y, x)
/**
 * @brief  获取 ncurses 屏幕高宽, 并定义变量及赋值
 * @note   
 * @retval 
 */
#define curseScreenMaxYXDefine(y, x)        \
        int y,x; curseScreenMaxYX(y, x);
/**
 * @brief  初始化 ncurses 屏幕, 并定义变量及赋值
 * @note   
 * @retval 
 */
#define createCurseScreenYXDefine(y,x)      \
        createCurseScreen();                \
        curseScreenMaxYXDefine(y,x);

// ---------------------------------------------------------------- Window

/**
 * @brief  为 Window 设置一个边框
 * @note   
 * @param  *window: 要处理的 Window 实例
 * @param  vc: 纵向边框符号, 0 为默认
 * @param  hc: 横向边框符号, 0 为默认
 * @retval None
 */
void curseWindowBox(CurseWindow *window, int vc, int hc);
/**
 * @brief  刷新 Window 显示状态
 * @note   
 * @param  *window: 要处理的 Window 实例
 * @retval None
 */
void curseWindowRefresh(CurseWindow *window);

/**
 * @brief  销毁 Window
 * @note   ! 未实现 !
 * @param  *window: 要处理的 Window 实例
 * @retval None
 */
void desctroyCurseWindow(CurseWindow *window);

/**
 * @brief  创建一个 Window
 * @note   
 * @param  height: Window 高度
 * @param  width: Window 宽度
 * @param  y: 起始 y 轴坐标
 * @param  x: 起始 x 轴坐标
 * @retval CurseWindow
 */
CurseWindow* createCurseWindow(int height, int width, int y, int x);
/**
 * @brief  创建一个 WindowBox
 * @note   
 * @param  height: Window 高度
 * @param  width: Window 宽度
 * @param  y: 起始 y 轴坐标
 * @param  x: 起始 x 轴坐标
 * @retval CurseWindow
 */
CurseWindow* createCurseWindowBox(int height, int width, int y, int x);
/**
 * @brief  创建一个 WindowBox
 * @note   
 * @param  height: Window 高度
 * @param  width: Window 宽度
 * @param  y: 起始 y 轴坐标
 * @param  x: 起始 x 轴坐标
 * @param  vc: 纵向边框符号, 0 为默认
 * @param  hc: 横向边框符号, 0 为默认
 * @retval CurseWindow
 */
CurseWindow* createCurseWindowRect(int height, int width, int x, int y, int vc, int hc);
// CurseWindow* createCurseWindowRefresh(int height, int width, int y, int x);
// CurseWindow* createCurseWindowBoxRefresh(int height, int width, int x, int y);
// CurseWindow* createCurseWindowRectRefresh(int height, int width, int x, int y, int v, int h);

// ---------------------------------------------------------------- Cursors
/**
 * @brief  移动 Window 中的光标
 * @note   
 * @param  *window: 要处理的 Window 实例
 * @param  y: Window 的 y 轴坐标
 * @param  x: Window 的 x 轴坐标
 * @retval 
 */
int curseWindowCursorMove(CurseWindow* window, int y, int x);
// ---------------------------------------------------------------- Border
// ---------------------------------------------------------------- Attributes
// ---------------------------------------------------------------- Colors
// ---------------------------------------------------------------- Terminal
void saveTerminalProgress();

// ---------------------------------------------------------------- Output
// ---------------------------------------------------------------- Input
// #define curseWindowPrint(window, format, args...)   \
        // vw_printf(window, format, ##args)

/**
 * @brief  在 Window 打印字符
 * @note   
 * @param  *window: 要处理的 Window 实例
 * @param  *format: 要打印的字符串
 * @retval 
 */
int curseWindowPrintf(CurseWindow *window, char *format, ...);
// ---------------------------------------------------------------- Menu
// ---------------------------------------------------------------- KeyBoard
// ---------------------------------------------------------------- Other Opers

#endif  //!__CURSEUTILS__H__